﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data;
using System.Data.SqlClient;


namespace ForrajeriaDAL
{
    public class ClienteDAL : AccesoDAL, InterfazDAL<ClienteMO>
    {
        private SqlCommand cmd;
        #region Singleton
        private static ClienteDAL instanceCliente;

        private ClienteDAL()
            : base()
        {

        }

        public static ClienteDAL getInstance
        {
            get 
            {
                if (instanceCliente == null)
                {
                    instanceCliente = new ClienteDAL();
                }
                return instanceCliente;
            }
        }
        #endregion 
        #region Interfaz

        #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL

        private static string insert = "Cliente_INSERT";
        private static string delete = "Cliente_DELETE";
        private static string update = "Cliente_UPDATE";
        private static string all = "Cliente_GetAll";

        #endregion

        public List<ClienteMO> GetAll()
        {
            SqlDataReader reader = null;
            List<ClienteMO> lista = new List<ClienteMO>();

            try
            {
                cmd = new SqlCommand(all, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ClienteMO aux = new ClienteMO();
                    //****************************Formar objeto aux**********************
                    aux.Codigo = int.Parse(reader["codigo"].ToString());
                    aux.ApellidoCliente = reader["ApellidoCliente"].ToString();
                    aux.NombreCliente = reader["NombreCliente"].ToString();
                    aux.Telefono = reader["telefono"].ToString();
                    aux.TipoDocumento = int.Parse(reader["TipoDocumento"].ToString());
                    aux.NumeroDocumento = int.Parse(reader["NroDocumento"].ToString());
                    aux.EstadoClie = reader["estadoClie"].ToString();

                    if (reader["codigo_usuario"].ToString() != "")
                        aux.Usuario = int.Parse(reader["codigo_usuario"].ToString());
                    else
                        aux.Usuario =  null ;

                    if (reader["calle"].ToString() != "")
                        aux.Calle = reader["calle"].ToString();
                    else
                        aux.Calle = "";
                    
                    
                    
                    if (reader["nro"].ToString() != "")
                        aux.NumeroCalle = int.Parse(reader["nro"].ToString());
                    else
                        aux.NumeroCalle = null;
                    

                    if (reader["piso"].ToString() != "")
                        aux.Piso = reader["piso"].ToString();
                    else
                        aux.Piso = "";

                    if (reader["dpto"].ToString() != "")
                        aux.Departamento = reader["dpto"].ToString();
                    else
                        aux.Departamento = "";

                    if (reader["id_localidad"].ToString() != "")
                        aux.Localidad = int.Parse(reader["id_localidad"].ToString());
                    else
                        aux.Localidad = null;


                    //************************Fin Formar objeto aux*********************
                    lista.Add(aux);
                    aux = null;

                }
                return lista;

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                closeReader(reader);
                closecon();
            }
        }

        public void Adicionar(ClienteMO item)
        {
            item.Codigo = getCodigoInsert("Cliente", "codigo");
            try
            {
                cmd = new SqlCommand(insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@codigo",  item.Codigo));
                cmd.Parameters.Add(new SqlParameter("@NombreCliente", item.NombreCliente));
                cmd.Parameters.Add(new SqlParameter("@ApellidoCliente", item.ApellidoCliente));
                cmd.Parameters.Add(new SqlParameter("@telefono", item.Telefono));
                cmd.Parameters.Add(new SqlParameter("@TipoDocumento", item.TipoDocumento));
                cmd.Parameters.Add(new SqlParameter("@NroDocumento", item.NumeroDocumento));
                cmd.Parameters.Add(new SqlParameter("@estadoClie",  item.EstadoClie));
                cmd.Parameters.Add(new SqlParameter("@calle", item.Calle));
                cmd.Parameters.Add(new SqlParameter("@nro",  item.NumeroCalle));
                cmd.Parameters.Add(new SqlParameter("@piso",item.Piso));
                cmd.Parameters.Add(new SqlParameter("@dpto",item.Departamento));
                cmd.Parameters.Add(new SqlParameter("@id_localidad", item.Localidad));

                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }

        }

        public void Eliminar(ClienteMO item)
        {
            try
            {
                cmd = new SqlCommand(delete, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@codigo", item.Codigo));

                opencon();
                cmd.ExecuteNonQuery();
                closecon();
            }

            catch (SqlException ex)
            {
                closecon();
                throw ex;

            }
        }

        public void Actualizar(ClienteMO nuevoItem, ClienteMO origItem)
        {

           // nuevoItem.Codigo = getCodigoInsert("Cliente", "codigo");
            try
            {
                cmd = new SqlCommand(update, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@codigo", origItem.Codigo));
                cmd.Parameters.Add(new SqlParameter("@NombreCliente", nuevoItem.NombreCliente));
                cmd.Parameters.Add(new SqlParameter("@ApellidoCliente", nuevoItem.ApellidoCliente));
                cmd.Parameters.Add(new SqlParameter("@telefono",  nuevoItem.Telefono));
                cmd.Parameters.Add(new SqlParameter("@TipoDocumento",  nuevoItem.TipoDocumento));
                cmd.Parameters.Add(new SqlParameter("@NroDocumento",  nuevoItem.NumeroDocumento));

                cmd.Parameters.Add(new SqlParameter("@estadoClie",  nuevoItem.EstadoClie));
                cmd.Parameters.Add(new SqlParameter("@calle",  nuevoItem.Calle));
                cmd.Parameters.Add(new SqlParameter("@nro", nuevoItem.NumeroCalle));
                cmd.Parameters.Add(new SqlParameter("@piso", nuevoItem.Piso));
                cmd.Parameters.Add(new SqlParameter("@dpto", nuevoItem.Departamento));
                cmd.Parameters.Add(new SqlParameter("@id_localidad",  nuevoItem.Localidad));
                if (nuevoItem.Usuario != null)
                {
                    cmd.Parameters.Add(new SqlParameter("@codigo_usuario",nuevoItem.Usuario));
                }
                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
        }
        #endregion


        public ClienteMO getByID(int codigo)
        {
            try
            {
                cmd = new SqlCommand("Cliente_getByID", getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@id",codigo));

                opencon();
                SqlDataReader reader = cmd.ExecuteReader();
                ClienteMO aux = new ClienteMO();
                if (reader.Read())
                {

                    aux.Codigo = int.Parse(reader["codigo"].ToString());
                    aux.ApellidoCliente = reader["ApellidoCliente"].ToString();
                    aux.NombreCliente = reader["NombreCliente"].ToString();
                    aux.Telefono = reader["telefono"].ToString();
                    aux.TipoDocumento = int.Parse(reader["TipoDocumento"].ToString());
                    aux.NumeroDocumento = int.Parse(reader["NroDocumento"].ToString());
                    aux.EstadoClie = reader["estadoClie"].ToString();

                    if (reader["codigo_usuario"].ToString() != "")
                        aux.Usuario = int.Parse(reader["codigo_usuario"].ToString());
                    else
                        aux.Usuario = null;

                    if (reader["calle"].ToString() != "")
                        aux.Calle = reader["calle"].ToString();
                    else
                        aux.Calle = "";



                    if (reader["nro"].ToString() != "")
                        aux.NumeroCalle = int.Parse(reader["nro"].ToString());
                    else
                        aux.NumeroCalle = null;


                    if (reader["piso"].ToString() != "")
                        aux.Piso = reader["piso"].ToString();
                    else
                        aux.Piso = "";

                    if (reader["dpto"].ToString() != "")
                        aux.Departamento = reader["dpto"].ToString();
                    else
                        aux.Departamento = "";

                    if (reader["id_localidad"].ToString() != "")
                        aux.Localidad = int.Parse(reader["id_localidad"].ToString());
                    else
                        aux.Localidad = null;

                }

                reader.Close();
                closecon();
                return aux;
            }

            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error de Tipo SQL SERVER: " + ex.Message);
            }
            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }

            

        }

        public List<ClienteMO> GetAllRegistrar()
        {
            SqlDataReader reader = null;
            List<ClienteMO> lista = new List<ClienteMO>();

            try
            {
                cmd = new SqlCommand("Clientes_GetAllRegistrar", getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ClienteMO aux = new ClienteMO();
                    //****************************Formar objeto aux**********************
                    aux.Codigo = int.Parse(reader["codigo"].ToString());
                    aux.ApellidoCliente = reader["ApellidoCliente"].ToString();
                    aux.NombreCliente = reader["NombreCliente"].ToString();
                    aux.Telefono = reader["telefono"].ToString();
                    aux.TipoDocumento = int.Parse(reader["TipoDocumento"].ToString());
                    aux.NumeroDocumento = int.Parse(reader["NroDocumento"].ToString());
                    aux.EstadoClie = reader["estadoClie"].ToString();

                    if (reader["codigo_usuario"].ToString() != "")
                        aux.Usuario = int.Parse(reader["codigo_usuario"].ToString());
                    else
                        aux.Usuario = null;

                    if (reader["calle"].ToString() != "")
                        aux.Calle = reader["calle"].ToString();
                    else
                        aux.Calle = "";



                    if (reader["nro"].ToString() != "")
                        aux.NumeroCalle = int.Parse(reader["nro"].ToString());
                    else
                        aux.NumeroCalle = null;


                    if (reader["piso"].ToString() != "")
                        aux.Piso = reader["piso"].ToString();
                    else
                        aux.Piso = "";

                    if (reader["dpto"].ToString() != "")
                        aux.Departamento = reader["dpto"].ToString();
                    else
                        aux.Departamento = "";

                    if (reader["id_localidad"].ToString() != "")
                        aux.Localidad = int.Parse(reader["id_localidad"].ToString());
                    else
                        aux.Localidad = null;


                    //************************Fin Formar objeto aux*********************
                    lista.Add(aux);
                    aux = null;

                }
                return lista;

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                closeReader(reader);
                closecon();
            }

        }

        public List<ClienteMO> BuscarClientes(string nombre, string apellido, int documento)
        {
            SqlDataReader reader = null;
            List<ClienteMO> lista = new List<ClienteMO>();
            try
            {
                cmd = new SqlCommand("Cliente_Buscar", getConexion());

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@nombre", nombre));
                cmd.Parameters.Add(new SqlParameter("@apellido", apellido));
                cmd.Parameters.Add(new SqlParameter("@documento", documento));

                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ClienteMO aux = new ClienteMO();
                    //****************************Formar objeto aux**********************
                    aux.Codigo = int.Parse(reader["codigo"].ToString());
                    aux.ApellidoCliente = reader["ApellidoCliente"].ToString();
                    aux.NombreCliente = reader["NombreCliente"].ToString();
                    aux.Telefono = reader["telefono"].ToString();
                    aux.TipoDocumento = int.Parse(reader["TipoDocumento"].ToString());
                    aux.NumeroDocumento = int.Parse(reader["NroDocumento"].ToString());
                    aux.EstadoClie = reader["estadoClie"].ToString();

                    if (reader["codigo_usuario"].ToString() != "")
                        aux.Usuario = int.Parse(reader["codigo_usuario"].ToString());
                    else
                        aux.Usuario = null;

                    if (reader["calle"].ToString() != "")
                        aux.Calle = reader["calle"].ToString();
                    else
                        aux.Calle = "";



                    if (reader["nro"].ToString() != "")
                        aux.NumeroCalle = int.Parse(reader["nro"].ToString());
                    else
                        aux.NumeroCalle = null;


                    if (reader["piso"].ToString() != "")
                        aux.Piso = reader["piso"].ToString();
                    else
                        aux.Piso = "";

                    if (reader["dpto"].ToString() != "")
                        aux.Departamento = reader["dpto"].ToString();
                    else
                        aux.Departamento = "";

                    if (reader["id_localidad"].ToString() != "")
                        aux.Localidad = int.Parse(reader["id_localidad"].ToString());
                    else
                        aux.Localidad = null;


                    //************************Fin Formar objeto aux*********************
                    lista.Add(aux);
                    aux = null;

                }
                return lista;

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                closeReader(reader);
                closecon();
            }

        }

    }
}
